AWS Elemental LinkとAWSソリューション実装でライブ動画配信をしてみた
はじめに
清水です。AWS Elemental MediaLive用のセットアップ済みライブエンコーダデバイスとして動作するAWS Elemental Linkを使って、ライブ配信構成を試しています。
- AWS Elemental LinkでAWS Media Servicesを使ったライブ配信をしてみた! | Developers.IO
- AWS Elemental LinkからAWS Elemental MediaLiveを経由してYouTube Liveでライブ配信をしてみた! | Developers.IO
そんな中、AWSのテクニカルリファレンス実装であるAWS Solutions Library/AWSソリューション実装の「Live Streaming on AWS」にてAWS Elemental Linkに対応するアップデートがありました。(2020/07/02にポストされたアップデートになります。)
- Live Streaming on AWS with MediaStore now supports AWS Elemental Link
- MediaStore を使用した AWS ライブストリーミングで、AWS Elemental Link のサポートを開始
アップデートしたのは以下のページで紹介されているAWSソリューション実装です。CloudFromationのテンプレートが用意されており、デプロイするだけで検証済みのテクニカルリファレンス実装が構築できます。
なお、AWS Elemental Linkに対応しているのはライブオリジンにAWS Elemental MediaStoreを使う「Live Streaming on AWS with MediaStore」であり、AWS Elemental MediaPackageを使用している「Live Streaming on AWS」は現時点ではまだ対応していない点に注意しましょう。
本エントリではこのAWSソリューション実装の「Live Streaming on AWS with MediaStore」でLinkデバイスを使って実際にライブ動画配信をしてみました。
AWSソリューション実装とAWS Elemental Linkでライブ動画配信をしてみた
それでは実際にAWSソリューション実装を使ってインフラを構築、Linkデバイスで映像を打ち上げてライブ動画配信をしてみます。
必要に応じて、デプロイガイドやGitHubで公開されているソースコードも参照してください。(いずれも冒頭で紹介したAWSソリューション実装のページからリンクされています。)
- Live Streaming on AWS with MediaStore - Live Streaming on AWS with MediaStore
- live-streaming-on-aws-with-mediastore.pdf
- GitHub - awslabs/live-streaming-on-aws-with-mediastore
事前準備
まず事前準備としてMediaStore用のIAMロールを作成しておきます。これはソリューションデプロイ後のAmazon CloudWatchダッシュボードを利用するために必要で、準備しなくてもソリューションのデプロイ自体は成功するとのことです。
詳細な手順については以下ブログエントリやAWSドキュメントを参考にしてください。
- [アップデート] AWS Elemental MediaStoreがアクセスログをサポートしました! | Developers.IO
- Amazon CloudWatch のアクセス許可のセットアップ - AWS Elemental MediaStore
以下、作成のポイントのみまとめていきます。
IAMポリシー「MediaStoreAccessLogsPolicy」の作成
以下の内容でIAMポリシーを作成します。IAMポリシーの名称はMediaStoreAccessLogsPolicy
とします。
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "logs:DescribeLogGroups", "logs:CreateLogGroup" ], "Resource": "*" }, { "Effect": "Allow", "Action": [ "logs:CreateLogStream", "logs:DescribeLogStreams", "logs:PutLogEvents" ], "Resource": "arn:aws:logs:*:*:log-group:/aws/mediastore/*" } ] }
IAMロール「MediaStoreAccessLogs」の作成
続いてIAMロールMediaStoreAccessLogs
を作成します。信頼されたエンティティとしてAWSアカウントを選択しておき自分のAWSアカウントIDを入力、アタッチするポリシーは先ほど作成したMediaStoreAccessLogsPolicy
を選択します。
IAMロールMediaStoreAccessLogs
を作成後、信頼関係を下記のように書き換えます。(ハイライト部分、変更前は"AWS": "arn:aws:iam::123456789012:root"
となっているはずです。)
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": "mediastore.amazonaws.com" }, "Action": "sts:AssumeRole", "Condition": {} } ] }
AWSソリューション実装「Live Streaming on AWS with MediaStore」のデプロイ
IAMポリシーとIAMロールが作成できたら、実際にAWSソリューション実装「Live Streaming on AWS with MediaStore」をデプロイします。
該当ページから[Launch in the AWS Console]ボタンで進みます。
AWSマネジメントコンソールのCloudFromation、Stack作成画面に遷移します。
ここで、今回Linkデバイスを準備しているリージョンはオレゴンリージョン(us-west-2)です。現在操作対象のリージョンをマネジメントコンソール右上部分で確認すると、N.Virginia
つまりバージニアリージョン(us-east-1)となっているので、オレンゴンリージョン(us-west-2/Oregon
)に変更しておきます。
希望のリージョンに変更できたら、Stackを作成するテンプレートの内容を確認して[Next]で進みます。
続く画面でパラメータを指定していきます。今回はデフォルト値から以下の変更をしました。
- 「LIVE STREAM SOURCE」の「Source Input Type」でデフォルトの
URL_PULL
からINPUT_DEVICE
を選択 - 「INPUT_DEVICE CONFIGURATION」の「Elemental Link Input Device ID」で使用するLinkデバイスのIDを入力
- 「ENCODING OPTIONS」の「Encoding Profile」でデフォルトの
HD-720p
からHD-1080p
を選択 - 「ENCODING OPTIONS」の「Start MediaLive Channel」をデフォルトの
true
からfalse
に変更
[Next]で進みます。続くスタックオプション設定画面はデフォルトのまま、[Next]で進み、最後の画面で内容を確認、IAMリソース作成についての承認にチェックを入れて[Create stack]でスタックを作成します。
スタック詳細画面に遷移しますので、作成状況を見守ります。
デプロイ時間は約5分とのことでした。およそ5分後、確認してみると以下のようにStackの作成が完了していました。
ライブ配信の開始
AWSソリューション実装「Live Streaming on AWS with MediaStore」のデプロイが完了したので、実際にLinkデバイスから映像を打ち上げ、ライブ動画配信ができることを確認してみたいと思います。
Linkデバイスの準備
まずはLinkデバイスの準備です。CloudFromation Stack作成時に指定したデバイスIDを持つLinkデバイスを電源ON、ネットワークに接続し映像を入力します。映像について、今回はMacBook Proのデスクトップ画面をHDMIで出力(ミラーリング)、音声もHDMI出力として、Big Bug Bunnyの4K版をVLC media playerで再生しました。
マネジメントコンソールのAWS Elemental MediaLiveのページ、左上のハンバーガーボタン「≡」からDevicesの項目に遷移して、該当のLinkデバイスが以下の状態であることを確認しておきます。
- Connection stateが
Connected
であること - Device stateが
Idle
であること
MediaLiveのChannelのStart
続いて、MediaLiveのChannelをStartさせます。マネジメントコンソールのMediaLinkのページ、左上のハンバーガーボタン「≡」からChannelsの項目に遷移、該当Channel(今回であればLiveStreamingwithMediaStore
)を選択して[Start]ボタンを押下します。
StateがRunning
になれば配信が開始されている状態です。
Linkデバイスについても自動で映像の打ち上げ(AWSへのストリーミング)が開始されています。
視聴確認
ライブ動画配信視聴用のURLについては、CloudFormationのStack詳細画面、Outputsの項目から確認できます。LiveStreamUrl
ですね。
こちらのURLをSafariなどHLSネイティブ対応のWebブラウザやVideo.jsなどHLS再生に対応した動画プレイヤーで再生します。今回はVideoJS HTTP Streamingのページで再生してみました。Video URLを入力、MimeTypeはデフォルトのapplication/x-mpegURL
のまま[Load]して再生ボタンをクリックすると再生が始まります。
CloudWatchダッシュボードの確認
ライブ動画配信中のCloudWatchダッシュボードの状況も確認しておきます。以下のように特に設定しなくてもいくつかのメトリクスがモニタリング可能です。
ライブ配信の終了と後片付け
ライブ配信が終了したら、まずはMediaLiveのChannelをStopしましょう。(MediaLiveはRunning
の状態で大きなAWS利用費が発生します。)
これでライブ動画配信は終了します。またLinkの映像の打ち上げもMediaLiveのChannelと連携して停止されます。
MediaLiveのChannel、InputやCloudWatchダッシュボードなど、ライブ動画配信を実施していなくても(例えばMediaLiveであればChannelがRunningの状態でなくても)料金が発生するリソースもあります。今回のCloudFromation Stackで作成されたリソースをよく確認し、Stackならびにリソースの削除をしておきましょう。
まとめ
AWS Elemental MediaLive用のセットアップ済みライブエンコーダデバイスとして動作するAWS Elemental Linkと、AWSソリューション実装「Live Streaming on AWS with MediaStore」を使ってライブ動画配信をしてみました。Linkデバイスを使ったライブ動画配信環境が非常に容易に構築が可能です。(Jeff BarrがAWS News BlogでElemental Linkについてポストした際にCloudFormationを利用した自動化されたソリューションを準備していると言っていましたが、それがこのAWSソリューション実装ですね。)今回CloudFromation Stack作成時のパラメータStart MediaLive Channel
についてはあえてfalse
にしましたが(ChannelのStart/Stopをコントロールしたかったので)、これをtrue
にすればLinkデバイスで映像を送るだけのライブ配信環境が構築できますね。また本エントリでも確認したCloudWatchダッシュボード含めて、AWSによるリファレンス実装ということもあり細かな設定もなされています。(例えばMediaStoreのオリジン保護もされていました。)このリファレンス実装を参考に、例えばS3にアーカイブ出力するなどカスタマイズしながら目的にあわせたライブ動画配信環境を構築していくのもよいかと考えます。